package edu.utn.tacs.gestion.service.dao.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

import edu.utn.tacs.gestion.domain.impl.Evento;
import edu.utn.tacs.gestion.domain.impl.Usuario;
import edu.utn.tacs.gestion.domain.impl.UsuarioAdministrador;
import edu.utn.tacs.gestion.exception.BusinessException;
import edu.utn.tacs.gestion.service.dao.interfaces.IGestionEventosDao;

/**
 * Clase de acceso a datos<li>Simula los pedidos a la base</li>
 */
public class GestionEventosDaoDummy implements IGestionEventosDao {

	private static IGestionEventosDao instance = null;
	Map<Long, Usuario> usuarios = new HashMap<Long, Usuario>();
	Map<Long, UsuarioAdministrador> usuariosAdministradores = new HashMap<Long, UsuarioAdministrador>();
	Map<String, Evento> eventos = new HashMap<String, Evento>();
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	static Logger logger = Logger.getLogger(GestionEventosDaoDummy.class);
	
	private GestionEventosDaoDummy() {
		this.init();
	}
	
	private void init() {
		initUsuarios();
		initUsuariosAdministradores();
		initEventos();
	}

	private void initUsuariosAdministradores() {
		logger.debug("Metodo: initUsuariosAdministradores()");
		this.usuariosAdministradores.put(new Long(24565409), new UsuarioAdministrador(new Long(24565409), "Willy"));
	}

	private void initEventos() {
		logger.debug("Metodo: initEventos()");
		Evento evento;
		try {
			evento = new Evento(
					usuarios.get(13465434), "Fiesta Murguera !!", sdf.parse("28/10/2009"), 4.5, "Carnaval de murgas y ritmos candomberos");
			evento.setUbicacion("Villa Urquiza - Olazabal y Triunvirato");
			this.eventos.put("Fiesta Murguera !!" + sdf.parse("28/10/2009"), evento); 
			logger.info("Evento creado: " + evento.getNombre());
			
			evento = new Evento(usuarios.get(16346576), "Vodoo lounge canival party", sdf.parse("15/11/2009"), 7, "Diabolic costume party");
			this.eventos.put("Vodoo lounge canival party" + sdf.parse("15/11/2009").toString(), evento);
			logger.info("Evento creado: " + evento.getNombre());
			
			evento = new Evento(usuarios.get(16346576), "Bailongo en el club social", sdf.parse("12/11/2009"), 6, "Baile para toda la familia");
			this.eventos.put("Bailongo en el club social" + sdf.parse("12/11/2009").toString(), evento);
					
			logger.info("Evento creado: " + evento.getNombre());
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}

	private void initUsuarios() {
		Usuario usuario;
		
		usuario = new Usuario(new Long(13465434), "Carlos Bianchi");
		this.usuarios.put(new Long(13465434), usuario);
		logger.info("Usuario creado: " + usuario.getNombre());
		usuario = new Usuario(new Long(16346576), "Diego Armando");
		this.usuarios.put(new Long(16346576), usuario);
		logger.info("Usuario creado: " + usuario.getNombre());
		usuario = new Usuario(new Long(20243657), "El Melli de la gente");
		this.usuarios.put(new Long(20243657), usuario);
		logger.info("Usuario creado: " + usuario.getNombre());
	}

	public static IGestionEventosDao getInstance() {
      if(instance == null) {
         instance = new GestionEventosDaoDummy();
      }
      return instance;
    }
	
	/**
	 * Registra un usuario en la red social
	 * @param nroDocumento
	 * @param nombre
	 * @throws BusinessException 
	 */
	public Usuario storeUsuario(Usuario usuario) throws BusinessException {
		logger.debug("Metodo: storeUsuario()");
		if(this.usuarios.containsValue(usuario)) {
			logger.error("BusinessException: Usuario ya registrado en la red social");
			throw new BusinessException("Usuario ya registrado en la red social");
		}
		this.usuarios.put(usuario.getNroDocumento(), usuario);
		logger.info("Se persiste al Usuario: " + usuario.getNombre());
		return usuario;
	}
	
	public UsuarioAdministrador storeUsuarioAdministrador(UsuarioAdministrador usuarioAdministrador) throws BusinessException {
		logger.debug("Metodo: storeUsuarioAdministrador()");
		if(this.usuariosAdministradores.containsValue(usuarioAdministrador)) {
			logger.error("BusinessException: Usuario Administrador ya registrado en la red social");
			throw new BusinessException("Usuario Administrador ya registrado en la red social");
		}
		this.usuariosAdministradores.put(usuarioAdministrador.getNroDocumento(), usuarioAdministrador);
		logger.info("Se persiste al UsuarioAdministrador: " + usuarioAdministrador.getNombre());
		return usuarioAdministrador;
	}
	
	/**
	 * Consulta si existe un usuario en la red social
	 */
	public boolean existeUsuario(Usuario usuario) {
		logger.debug("Metodo: existeUsuario()");
		return this.usuarios.containsValue(usuario);
	}
	
	public boolean existeEvento(Evento evento) {
		logger.debug("Metodo: existeEvento()");
		return this.eventos.containsValue(evento);
	}
	
	/* (non-Javadoc)
	 * @see edu.utn.tacs.gestion.service.dao.IGestionEventosDa#getUsuario(long)
	 */
	public Usuario getUsuario(long nroDocumento) throws BusinessException {
		logger.debug("Metodo: getUsuario()");
		return this.usuarios.get(nroDocumento);	
	}
	
	public Usuario getUsuarioAdministrador(long nroDocumento) throws BusinessException {
		logger.debug("Metodo: getUsuarioAdministrador()");
		return this.usuarios.get(nroDocumento);	
	}
	
	/* (non-Javadoc)
	 * @see edu.utn.tacs.gestion.service.dao.IGestionEventosDa#getEvento(java.lang.String, java.lang.String)
	 */
	public Evento getEvento(String nombre, String fecha) {
		logger.debug("Metodo: getEvento()");
		return this.eventos.get(nombre + fecha);
	}
	
	public Collection<Evento> getEventos() {
		logger.debug("Metodo: getEventos()");
		return this.eventos.values();
	}

	/**
	 * Simula la persistencia de un evento
	 */
	public Evento storeEvento(Evento evento) throws BusinessException {
		logger.debug("Metodo: storeEvento()");
		if(this.eventos.containsValue(evento)) {
			logger.error("BusinessException: Evento ya registrado en la red social");
			throw new BusinessException("Evento ya registrado en la red social");
		}
		this.eventos.put(evento.getDescripcion(), evento);
		logger.info("Evento: " + evento.getNombre());
		return evento;
	}

	public UsuarioAdministrador getUsuarioAdministrador(Long nroDocumento) throws BusinessException {
		logger.debug("Metodo: getUsuarioAdministrador()");
		return this.usuariosAdministradores.get(nroDocumento);
	}

	public boolean existeUsuarioAdministrador(UsuarioAdministrador usuarioAdministrador) {
		logger.debug("Metodo: existeUsuarioAdministrador()");
		return this.usuariosAdministradores.containsValue(usuarioAdministrador);
	}
	
}
